package org.xx.b2d;

import java.util.Objects;

/**
 * 世界。
 */
public abstract class World {
    public static final int DEFAULT_SPEED = 10;

    public static int BASE_WIDTH = 640;
    public static int BASE_HEIGHT = 480;
    public static int BLOCK_UNIT = 8;
    public static int LOGIC_WIDTH = BASE_WIDTH / BLOCK_UNIT;
    public static int LOGIC_HEIGHT = BASE_HEIGHT / BLOCK_UNIT;

    private final int speed;

    private Scene scene;

    protected World(
            int speed
    ) {
        this.speed = speed;
    }

    public static void main(
            String[] args
    ) {
        final var world = new BasicWorld(DEFAULT_SPEED);
        world.setScene(new BasicScene());
        world.show(DisplayParams.DEFAULT);
    }

    /**
     * 获取世界的标题。
     *
     * @return 世界的标题。
     */
    public abstract String getTitle();

    /**
     * 设置世界的标题。
     *
     * @param title
     *         世界的标题。
     */
    public abstract void setTitle(
            String title
    );

    public int getSpeed() {
        return this.speed;
    }

    /**
     * 显示世界。
     *
     * @param displayParams
     *         显示参数。
     */
    public abstract void show(
            DisplayParams displayParams
    );

    /**
     * 隐藏世界。
     */
    public abstract void hide();

    /**
     * 执行世界的循环。
     */
    public abstract void loop();

    /**
     * 获取当前场景。
     *
     * @return 当前场景。
     */
    public synchronized Scene getScene() {
        return this.scene;
    }

    /**
     * 设置当前场景。
     *
     * @param value
     *         当前场景。
     */
    public synchronized void setScene(
            Scene value
    ) {
        this.scene = Objects.requireNonNull(value, "Scene cannot be null");
    }
}
